const { app, BrowserWindow, ipcMain, dialog } = require('electron');
const path = require('path');
const fs = require('fs');

// 确保只有一个实例运行
const gotTheLock = app.requestSingleInstanceLock();

if (!gotTheLock) {
  app.quit();
} else {
  app.on('second-instance', (event, commandLine, workingDirectory) => {
    // 当运行第二个实例时，聚焦到主窗口
    if (mainWindow) {
      if (mainWindow.isMinimized()) mainWindow.restore();
      mainWindow.focus();
    }
  });

  // 保持对窗口对象的全局引用，避免被垃圾回收
  let mainWindow;

  function createWindow() {
    // 创建浏览器窗口
    mainWindow = new BrowserWindow({
      width: 1024,
      height: 768,
      minWidth: 800,
      minHeight: 600,
      webPreferences: {
        preload: path.join(__dirname, 'preload.js'),
        nodeIntegration: true,
        contextIsolation: false,
      },
      title: '考试应用',
      icon: path.join(__dirname, 'favicon.ico'),
    });

    // 加载index.html文件
    mainWindow.loadFile(path.join(__dirname, 'index.html'));

    // 打开开发者工具（生产环境可移除）
    // mainWindow.webContents.openDevTools();

    // 窗口关闭时触发
    mainWindow.on('closed', () => {
      mainWindow = null;
    });
  }

  // 当Electron完成初始化并准备创建浏览器窗口时调用
  app.on('ready', createWindow);

  // 当所有窗口关闭时退出应用
  app.on('window-all-closed', () => {
    // 在macOS上，除非用户用Cmd+Q确定退出，否则应用及其菜单栏会保持活动状态
    if (process.platform !== 'darwin') {
      app.quit();
    }
  });

  app.on('activate', () => {
    // 在macOS上，当点击dock图标且没有其他窗口打开时，通常会重新创建一个窗口
    if (mainWindow === null) {
      createWindow();
    }
  });

  // 处理从渲染进程发送的消息
  ipcMain.on('read-file', (event, filePath) => {
    try {
      const data = fs.readFileSync(filePath, 'utf8');
      event.reply('file-content', { success: true, content: data });
    } catch (error) {
      event.reply('file-content', { success: false, error: error.message });
    }
  });

  // 显示对话框
  ipcMain.on('show-dialog', (event, options) => {
    const result = dialog.showMessageBoxSync(mainWindow, options);
    event.reply('dialog-result', result);
  });
}

// 应用退出前保存数据
app.on('before-quit', () => {
  // 可以在这里添加保存用户数据的逻辑
});